package com.cskaoyan.javase.oop3._2inner._0introduction;

/**
 * 内部类的引入
 * 内部类,作为初学者,以学习语法为主要目的,暂时不深入探究它的用途
 *
 * 引例
 * 我们现在做一个应用程序
 * 需要描述一台电脑中的CPU，对于电脑而言，该怎么去描述这个CPU呢？
 *
 * 分析：
 *
 * 我们可以创建两个类，一个描述Computer，一个描述CPU。但这样明显是有问题的：
 *
 * CPU是电脑中最重要的组件，但它脱离电脑存在就是一粒沙子。
 * 这意味着CPU对象，应仅存在于Computer内部。
 * 这个需求是: 某个类的对象,应该仅能够在这个类的内部创建,在该类的外部是无法创建的.(需求一)
 * 这个需求目前的知识点是满足不了的
 *
 * CPU可以控制计算机的一切硬件资源。这意味CPU对象能够操控，Computer类中的所有成员，无论私有。
 * 这个需求是: 某个类的对象,要能够访问另外一个类中的所有成员,包括私有.(需求二)
 * 这个需求目前的知识点也是满足不了的
 *
 * 定义普通类CPU是不能完成需求的，因为：
 * 普通类没有私有概念，不可能控制仅能在Computer内部创建对象。
 * 普通类不可能直接访问，其它类的私有成员。
 * 显然CPU类不应该是一个普通类，不应该是一个独立的类 ---> 不再将CPU类定义为一个独立的类，而是将它放入Computer类的类体中，可以近似的看成是一个Computer类的成员 ---> CPU类近似看成Computer类的成员，于是：
 *
 * 在其它类内部的类，就有了私有概念，就有了四种访问权限。
 *      1.只需要在内部私有化一个类，那么在外界就无法创建它的对象了。(满足了需求一)
 *      2.既然已经成为了成员，成为了"自己人"
 *          那么就不再受限于权限控制了，内部类就可以访问包裹它的类的所有成员，包括私有。(满足了需求二)
 * 上述两条，其实就是（成员）内部类的主要特点。
 * 也说明了使用内部类的主要场景：
 *
 * 内部类是一种比普通类更加极致的封装思想体现，内部类的成员不仅被类自身保护，还被包裹着它的类保护。
 * 内部类和包裹它的类互相成为了"好兄弟"，互相访问成员都不受访问权限限制。
 * 当你有以上使用场景时，就可以考虑使用内部类。
 *
 * 内部类定义
 *      在Java语言中类可以嵌套定义，广义的内部类指的是定义在另一类当中的一个类。
 *
 * 当然内部类有很多，如果按照内部类在类中定义的位置不同，可以分为：
 *      1.定义在成员位置的内部类，包括成员内部类，静态内部类。
 *      2.定义在局部位置的内部类，包括局部内部类，匿名内部类以及Lambda表达式。
 *
 * 但是我们在学习的时候，不按定义位置来学习。
 *      我们按照它的语法是定义一个类，还是直接创建一个对象来分类：
 *      1.语法定义了一个类，包括成员内部类、静态内部类和局部内部类。(了解语法,会用语法即可)
 *          既然是定义了一个类，使用时还需要创建对象才能用。
 *          所以既然都是要创建对象,干脆直接内部类语法创建对象,使用起来更快速方便.
 *
 *      2.语法直接创建了一个对象，包括匿名内部类和Lambda表达式。(作为重点学习,实际开发中它们最常用,尤其是Lambda表达式)
 *           由于已经通过语法创建了对象，可以直接使用。
 *
 * 为了上课方便，我们需要统一口径，在内部类课程当中，我们统一规定：
 *      1.像CPU这种，定义在别的类的内部的类，我们称之为内部类。（inner）
 *      2.像Computer这种，包裹内部类的，我们称之为外围类。（enclosed）
 *      3.Demo这种类我们称之为外部类,其他类。（outside）
 *
 * @since 10:48
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // CPU c = new CPU();
    }
}

// 电脑类,计算机类
class Computer {
    // 属性
    private CPU cpu = new CPU();
    // 行为

    private class CPU {
        private int num;
    }
}
// CPU类
/*
class CPU{
    // 属性
    // 行为
}*/
